package cn.smdq.ch.code.generator.config;

import cn.smdq.ch.code.generator.util.OutputPathExtractor;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description TODO
 * @Author shuimodanqing
 * @Date 2019/1/18  1:40 PM
 */
public class GenerationConfigBuilder {

    public static DataSourceConfig buildDataSourceConfig() {

        DataSourceConfig dsc = new DataSourceConfig();

        //1. 数据库类型
        dsc.setDbType(DbType.MYSQL);
        //2. 数据库驱动
        dsc.setDriverName("com.mysql.jdbc.Driver");
        //3. 数据库用户名
        dsc.setUsername("root");
        //4. 数据库密码
        dsc.setPassword("123456");
        //5. 数据库url
        dsc.setUrl("jdbc:mysql://localhost:3306/hope?useUnicode=true&characterEncoding=utf8&useSSL=false");
        return dsc;
    }

    public static GlobalConfig buildGlobalConfig(String outputDir) {

        GlobalConfig gc = new GlobalConfig();

        //1. 代码输出目录
        gc.setOutputDir(outputDir);
        //2. 是否在生成代码后打开生成代码文件的窗口
        gc.setOpen(false);
        //3. 开发人员
        gc.setAuthor("shuimo@danqing");
        //4. 生成基本的ResultSetMap
        gc.setBaseResultMap(true);
        //5. 生成基本的SQL片段(<sql id="xx">xx,xx,xx,xx</sql>)
        gc.setBaseColumnList(true);
        //6. 是否支持AR模式: 即实体类只需继承Model类即可实现基本的CRUD操作、简单来说就是一个实体类继承Model类，并通过
        //   注解与数据库的表进行关联、这样就可以通过实体类直接进行表的简单增删改查操作。
        gc.setActiveRecord(true);
        //7. 是否开启二级缓存
        gc.setEnableCache(false);
        //8. 是否允许文件覆盖
        gc.setFileOverride(false);
        return gc;
    }

    public static StrategyConfig buildStrategyConfig(String tablePrefix, String superController, String superService, String superMapper, String... tableArr) {
        StrategyConfig sc = new StrategyConfig();

        //1. 表名生成策略-驼峰
        sc.setNaming(NamingStrategy.underline_to_camel);
        //2. 表前缀
        sc.setTablePrefix(tablePrefix);
        //3. 需要生成的表
        sc.setInclude(tableArr);
        //4. Controller父类
        sc.setSuperControllerClass(StringUtils.isEmpty(superController) ? null : superController);
        //5. Service父类
        sc.setSuperServiceClass(StringUtils.isEmpty(superService) ? null : superService);
        //6. Mapper父类
        sc.setSuperMapperClass(StringUtils.isEmpty(superMapper) ? null : superMapper);
        //7. 使用lombok生成实体
        sc.setEntityLombokModel(true);
        return sc;
    }


    public static InjectionConfig buildInjectionConfig(String projectDir) {

        List<FileOutConfig> foutConfigList = new ArrayList<>();
        //1. 自定义mapper.xml的输出目录-src/main/resources/mapper目录下
        foutConfigList.add(new FileOutConfig("/templates/mapper.xml.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return projectDir + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
            }
        });
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {

            }
        }.setFileOutConfigList(foutConfigList);
        return cfg;
    }

    public static PackageConfig buildPackageConfig(String parent) {
        PackageConfig pc = new PackageConfig();

        //1. 生成Controller的包名
        pc.setController("controller");
        //2. 生成Service的包名
        pc.setService("service");
        //3. 生成impl实现类的包名
        pc.setServiceImpl("service.impl");
        //4. 生成Mapper的包名
        pc.setMapper("mapper");
        //5. 生成Entity的包名
        pc.setEntity("model.dto");
        //6. 设置父包
        pc.setParent(parent);
        return pc;
    }

    public static String buildOutputDir(String moduleName) {
        return OutputPathExtractor.basePath() + "/" + moduleName;
    }

}
